home *** CD-ROM | disk | FTP | other *** search
/ Whiteline: delta / whiteline CD Series - delta.iso / progtool / modula2 / module / easywind.def < prev    next >
Text File  |  1995-11-25  |  19KB  |  419 lines

  1. (******************************************************************************)
  2. (*      This MODULE is Public Domain. Copy me like a beast!                   *)
  3. (*               Christian Ledermann                                          *)
  4. (*               Wölfelkofen 2                                                *)
  5. (*               84166 Adlkofen                                               *)
  6. (******************************************************************************)
  7. (*                                                                            *)
  8. (* Started:   20.12.92     03:54:30                                           *)
  9. (* Version: 20.12.89   00:404:12:54                                           *)
  10. (*                                                                            *)
  11. (******************************************************************************)
  12. (*                                                                            *)
  13. (* Diese Software ist ohne jede Garantie. Ich verspreche                      *)
  14. (* keinerlei Wartung und übernehme keine Verantwortung für Schäden die        *)
  15. (* durch die Benutzung dieses Programmes entstehen.                           *)
  16. (* Jegliche Ersatzansprüche lehne ich ab.                                     *)
  17. (*                                                                            *)
  18. (******************************************************************************)
  19. DEFINITION MODULE  EasyWindow;
  20.  
  21. (* NeuImplementation und Anpassung von : *)
  22. (* MODULE WindowBase; *)                (* Hans Endl  25. 09. 1986 *)
  23.                                         (*            02. 06. 1987 *)
  24.                                         (*            01. 10. 1987 *)
  25.  
  26.  
  27. (**************************************************************************)
  28. (* Mit der Einführung von WinX und MultiGEM stehen nun mehr als 8 Fenster *)
  29. (* unter GEM zur Verfügung.                                               *)
  30. (* Die Tricksereien mit Aktivate und Deaktivate zur Verwaltung von 12     *)
  31. (* Fenstern sind also hinfällig geworden.                                 *)
  32. (* Zudem sind hier nun auch die Interna des Modules zugänglich.           *)
  33. (* BugFixes und Verbesserungen lassen sich also ohne weiteres vornehmen.  *)
  34. (**************************************************************************)
  35.  
  36.  
  37. FROM SYSTEM     IMPORT ADDRESS,BYTE;
  38. FROM GEMVDIbase IMPORT PxyArrayType;
  39.  
  40.  
  41. (*   Dieses Modul stellt eine Zwischenschicht zur Fensterprogrammierung
  42.      zur Verfügung, die etwas komfortablere Funktionen als die reinen
  43.      AES-Aufrufe enthält, aber nicht so sehr einschränkt wie die auf
  44.      MEDOS basierenden Moduln "Windows", "TextWindows" und "Graphic-
  45.      "Windows".
  46.  
  47.      Wichtige Bestandteile von "WindowBase" sind
  48.  
  49.      - die Struktur "windowtype", die die unter AES am häufigsten
  50.        benötigten Fensterdaten enthält
  51.  
  52.      - Prozeduren zum Setzen der Schieber
  53.  
  54.      - die automatische Abarbeitung der Rechteckliste bei Redraw-
  55.        Aufrufen
  56. *)
  57.  
  58. CONST
  59.  
  60. (*  ehemals :                                                            *)
  61. (*  maxwindow  = 12; (* 7 Fenster in GEM-AES möglich + 5 für Debugger *) *)
  62. (*                                                                       *)
  63.  
  64. (*neu*)  maxwindow  = 127;       (* geändert für WinX und MultiTOS ... *)
  65.          deskhandle = 0;
  66. (*neu*)
  67.     (* Window-Arrowed Ergebnisse *)
  68.     WindowUpPage=0;
  69.     WindowDownPage=1;
  70.     WindowUpLine=2;
  71.     WindowDownLine=3;
  72.     WindowLeftPage=4;
  73.     WindowRightPage=5;
  74.     WindowLeftLine=6;
  75.     WindowRightLine=7;
  76.     (* eigentlich sollten diese ereignisse in GEMAESBase definiert sein *)
  77.  
  78.  
  79. TYPE
  80.   window         = INTEGER;
  81.  
  82.   (* Aus Gründen der Kompatibilität zu AES und MEDOS wird zur Iden-
  83.      tifikation eines Fensters nicht ein Zeiger auf den unten defi-
  84.      nierten Window-Record benutzt, sondern eine Integer-Zahl, die
  85.      mit dem AES-Window-Handle identisch ist und als Index eines
  86.      Feldes von ((*neu*)POINTER TO) Window-Records fungiert.
  87.   *)
  88.  
  89.  
  90.   rectangle      = RECORD
  91.                      x: INTEGER;  (* x-Koordinate der linken oberen Ecke *)
  92.                      y: INTEGER;  (* y-Koordinate der linken oberen Ecke *)
  93.                      w: INTEGER;  (* Breite *)
  94.                      h: INTEGER   (* Höhe   *)
  95.                    END;
  96.  
  97.   (* Definition eines Rechtecks in AES-spezifischer Form mit linker
  98.      oberer Ecke und Breite und Höhe in Pixeln, im Gegensatz zu der
  99.      vom VDI meist benutzten Form des PxyArrays, das durch zwei dia-
  100.      gonal gegenüberliegende Ecken definiert wird.
  101.   *)
  102.  
  103.   WindowElement  = (Title, CloseButton, FullButton, Moveable,
  104.                     InfoLine, SizeButton, UpArrow, DownArrow,
  105.                     VertSlider, LeftArrow, RightArrow, HorizSlider);
  106.  
  107.   WindowElements = SET OF WindowElement;
  108.  
  109. (*neu*)  Effects = (Bold,Light,Italic,Underlined,Outlined,Shaded);
  110. (*neu*)  TextEffects = SET OF Effects;
  111.  
  112. CONST
  113.   AllElements = WindowElements {Title..HorizSlider};
  114.   NoElements  = WindowElements{};
  115. (*neu*)  NoEffects = TextEffects{};
  116.  
  117. TYPE
  118.   wstring     = ARRAY [0..79] OF CHAR;  (* String für Titel und Info *)
  119.   RedrawProcType = PROCEDURE (window, rectangle);
  120.  
  121.  
  122.   windowtype  = RECORD
  123.                   handle:     INTEGER;        (* AES-Fensternummer        *)
  124.                   max:        rectangle;      (* Maximale Fenstergröße    *)
  125.                   total:      rectangle;      (* Aussenmasse des Fensters *)
  126.                   work:       rectangle;      (* Innenmasse des Fensters  *)
  127.     (*neu*)       min:        rectangle;      (* Minimale Fenstergröße    *)
  128.                   elements:   WindowElements; (* Menge der Fensterelemente*)
  129.                   fulled:     BOOLEAN;        (* Fenster auf max gesetzt  *)
  130.                   opened:     BOOLEAN;        (* Fenster geöffnet         *)
  131.                   ontop:      BOOLEAN;        (* TRUE, falls oberstes F.  *)
  132.                   text:       BOOLEAN;        (* TRUE, falls Textfenster  *)
  133.     (*neu*)       grow:       BOOLEAN;        (* Wenn diese Variable auf TRUE gesetzt ist,
  134.                                                  wächst bzw. schrumpft das Fenster beim
  135.                                                  Öffnen bzw. Schliessen *)
  136.     (*neu*)       snap:       BOOLEAN;        (* Fenster Snappen *)
  137.     (*neu*)       allignX,
  138.     (*neu*)       allignY :   INTEGER;        (* horizontale /vertikale Ausrichtung *)
  139.     (*neu*)       scrollX,
  140.     (*neu*)       scrollY :   INTEGER;        (* Scrollwert : um diesen Betrag wird
  141.                                                  der Fensterinhalt bei Betätigen der
  142.                                                  Schieber gerollt *)
  143.                   row, col:   INTEGER;        (* Zeile und Spalte bei Text Pixel bei Grafik *)
  144.                   maxrow:     INTEGER;        (* letzte  Zeile   *)
  145.                   maxcol:     INTEGER;        (* letzte  Spalte  *)
  146.                   colour:     INTEGER;        (* Hintergrundfarbe         *)
  147.                   CASE :BOOLEAN OF
  148.                        TRUE:
  149.                   style:      INTEGER;        (* Fülltyp für Hintergrund  *)
  150.                        |FALSE:
  151.     (*neu*)           InteriorStyle : BYTE;
  152.     (*neu*)           FillStyle     : BYTE;   (* so ist es einfacher den Fülltyp einzustellen*)
  153.                   END(*CASE*);
  154.                   textcolour: INTEGER;        (* Farbe des Textes         *)
  155.     (*neu*)       texteffects:TextEffects;    (* Text-Effekte             *)
  156.                   redrawproc: RedrawProcType; (* Redraw-Procedure         *)
  157.                   title:      wstring;        (* Titelzeile               *)
  158.                   info:       wstring;        (* Informationszeile        *)
  159.                   reference:  ADDRESS;        (* frei für Anwender        *)
  160.                 END;
  161.  
  162.  
  163.  
  164.  
  165.  
  166. TYPE
  167.   windowptr   = POINTER TO windowtype;
  168.  
  169.  
  170. VAR
  171. (*neu*)  windowlist: ARRAY [-1..maxwindow] OF windowptr;
  172.  
  173.   (* In WindowBase war es noch :
  174.  
  175.      windowlist: ARRAY [0..maxwindow] OF windowtype;
  176.  
  177.    aber mit der größeren Anzahl von Fenstern ist es günstiger
  178.    hier ein speicherplatzsparenderes ARRAY zu benutzen.
  179.    Nicht vorhandene ( mit createWindow erzeugte )Fenster belegen hier
  180.    nur den Speicherplatz eines POINTERs (4 BYTE)  und nicht den
  181.    eines ganzen WindowTypes *)
  182. (* Default Werte *)
  183.  
  184.   growbox:    BOOLEAN;    (* Wenn diese Variable auf TRUE gesetzt ist,
  185.                              wachsen bzw. schrumpfen die Fenster beim
  186.                              Öffnen bzw. Schliessen, default = TRUE *)
  187.  
  188. (*neu*)  Snap:       BOOLEAN;    (* Fenster Snappen Ja/Nein,default = FALSE *)
  189.  
  190. (*neu*)  AllignX,
  191. (*neu*)  AllignY :   INTEGER;    (* horizontale /vertikale Ausrichtung
  192.                                     Default = 1/1  *)
  193.  
  194.  
  195.  
  196. (*neu*)  PROCEDURE TerminateWindows;(* Alle Fenster schließen (AES.CloseWindow),
  197.                                        ihre handles freigeben (AES.DeleteWindow)
  198.                                        und den Speicherplatz für die MODULE-interne
  199.                                        Verwaltung freigeben (STORAGE.DEALLOCATE).
  200.                                        !!!!! ACHTUNG !!!!!!
  201.                                        Unbedingt vor Verlassen des Programmes
  202.                                        aufrufen !! *)
  203.  
  204.  
  205.   PROCEDURE createWindow (VAR u:      window;
  206.                           x, y, w, h: INTEGER;
  207.                           parts:      WindowElements;
  208.                           title:      ARRAY OF CHAR;
  209.                           textwindow: BOOLEAN;
  210.                           rdp:        RedrawProcType);
  211.  
  212.   (* Erzeugt die im AES und in diesem Modul notwendigen Datenstrukturen
  213.      zur Verwaltung eines Fensters, das jedoch noch nicht gezeichnet
  214.      wird.
  215.  
  216.      x, y, w und h beschreiben die maximale Grösse des äusseren Fenster-
  217.      randes. Sind w und h gleich 0, so wird die Grösse des Desktops
  218.      ohne Menüleiste übernommen.
  219.  
  220.      "parts" ist ein Set aus den gewünschten Fensterelementen.
  221.  
  222.      "title" ist der Fenstertitel.
  223.  
  224.      "textwindow" soll bei Textfenstern auf TRUE gesetzt werden,
  225.      der Fensterursprung wird dann an das Textraster angepaßt.
  226.  
  227.      "rdp" ist die Redraw-Prozedur, also die Prozedur, die den Inhalt
  228.      des Fensters zeichnet. Sie wird beim Aufruf der Prozedur "DoRedraw"
  229.      (siehe unten) so oft aufgerufen wird, bis die Rechteckliste, die
  230.      die sichtbaren Teile des Fensters angibt, abgearbeitet worden ist.
  231.      An "rdp" wird beim Aufruf ein Rechteck übergeben, das die neu
  232.      zu zeichnende Fläche angibt. Wurde beim Aufruf von "DoRedraw"
  233.      der Paramter "clip" auf FALSE gesetzt, muss "rdp" alle Ausgaben
  234.      selbst auf diese Fläche begrenzen, was die Ausgabe vor allem bei
  235.      Text stark beschleunigen kann, aber bei teilweise verdeckten Fen-
  236.      stern kaum durchführbar ist. Beim Zeichnen von Objektbäumen wird
  237.      das Begrenzungsrechteck direkt beim "ObjectDraw"-Aufruf angegeben.
  238.   *)
  239.  
  240. (*neu*)
  241. (* ersatzlos getrichen :                                                  *)
  242. (* PROCEDURE activate     (u: window);                                    *)
  243. (* PROCEDURE deactivate   (u: window);                                    *)
  244. (*  wird nicht mehr benötigt da nun genügend Fenster zur Verfügung stehen *)
  245.  
  246.  
  247.   PROCEDURE clearWindow  (u: window );
  248.  
  249.   PROCEDURE closeWindow  (u: window );
  250.  
  251.   PROCEDURE deleteWindow (VAR u: window );
  252.                          (* window wird auf -1 gesetzt! *)
  253.  
  254.   PROCEDURE fullWindow   (u: window );
  255.  
  256.   PROCEDURE openWindow   (u: window ; x, y, w, h: INTEGER);
  257.                          (* falls x,y,w,h =0 wird die vorige Grösse des
  258.                             Fensters wiederhergestellt *)
  259.   PROCEDURE setWindow    (u: window ; x, y, w, h: INTEGER);
  260.  
  261.   PROCEDURE topWindow    (u: window);
  262.  
  263.   PROCEDURE MouseOn;
  264.  
  265.   PROCEDURE MouseOff;
  266.  
  267.   (* Vor Ausgaben auf den Bildschirm muss die Maus ausgeschaltet werden,
  268.      da sonst das Maussymbol überschrieben wird und bei der nächsten
  269.      Bewegung der Maus der alte, zuvor von der Maus verdeckte Bildschirm-
  270.      inhalt wieder restauriert wird. Alle Prozeduren in diesem Modul, die
  271.      den Bildschirm verändern, schalten die Maus während der Ausgabe aus.
  272.      Während des Aufrufs der vom Benutzer bereitgestellten Redraw-Prozedur
  273.      beim Abarbeiten der Rechteckliste in "DoRedraw" wird die Maus eben-
  274.      falls ausgeschaltet, ruft der Benutzer dagegen selbst seine Redraw-
  275.      Prozedur auf oder benutzt er die weiter unten beschriebenen Textaus-
  276.      gabeprozeduren, muss er sich selbst um die Maus kümmern.
  277.  
  278.      Achtung:  Ein- und Ausschalten der Maus wird vom Betriebssystem
  279.                mitgezählt. Wird die Maus mehrmals ausgeschaltet, muß
  280.                sie genausooft wieder eingeschaltet werden, damit sie
  281.                sichtbar wird. Wird die Maus zu oft eingeschaltet, dann
  282.                entstehen beim Bewegen von Fenstern und Schiebern Schmutz-
  283.                effekte.
  284.   *)
  285.  
  286.  
  287.   PROCEDURE SetHorSlider (u: window ; wpos, wsize, total: INTEGER);
  288.  
  289.   (* siehe "SetVertSlider", setzt den horizontalen Schieber entsprechend
  290.      der horizontalen Position des Fensters im Gesamtdokument.
  291.   *)
  292.  
  293.   PROCEDURE SetInfo      (u:  window ; s: ARRAY OF CHAR);
  294.  
  295.   (* Schreibt einen Text in die Info-Zeile des Fensters *)
  296.  
  297.   PROCEDURE SetTitle     (u: window ; s:ARRAY OF CHAR);
  298.  
  299.   (* Schreibt einen Text in die Titel-Zeile des Fensters. Der Text
  300.      bleibt beim Schliessen erhalten und wird beim Öffnen wieder
  301.      angezeigt
  302.    *)
  303.  
  304.   PROCEDURE SetVertSlider (u: window ; wpos, wsize, total: INTEGER);
  305.  
  306.   (* Berechnet die korrekte Position und -grösse des vertikalen
  307.      Schiebers aus den Parametern, die die vertikale Position des
  308.      Fensters im Gesamtdokument beschreiben, und setzt den Schieber.
  309.      Die Schieber müssen, falls vorhanden, nach jeder Veränderung
  310.      der Fenstergrösse oder des Fensterinhalts neu gesetzt werden.
  311.  
  312.      Bedeutung der Parameter:
  313.  
  314.      wpos:   Anfangsposition des Fensters im Gesamtdokument
  315.      wsize:  Grösse des im Fenster dargestellten Teils des Gesamtdokuments
  316.      total:  Grösse des Gesamtdokuments
  317.   *)
  318.  
  319.   PROCEDURE clearrect (u: window ; rect: rectangle);
  320.  
  321.   (* Löscht einen Rechteckbereich innerhalb des Fensters "u" in
  322.      Fensterkoordinaten *)
  323.  
  324.  
  325.   PROCEDURE copyrect (u: window ; source, dest: rectangle);
  326.  
  327.   (* Kopiert innerhalb eines Fensters den Rechteckbereich "source" in
  328.      den Rechteckbereich "dest" (Koordinaten relativ zum Fensterursprung
  329.      links oben). Der freiwerdende Bereich von "source" muss bei Bedarf
  330.      gelöscht werden. Mit dieser Prozedur lassen sich Scroll-,
  331.      Insert- und Deletefunktionen in Textfenstern realisieren *)
  332.   (* Achtung ! Dies funktioniert nur bei Fenstern die nicht verdeckt
  333.      liegen. Vor Aufruf dieser Routine sollte überprüft werden ob
  334.      das Fenster das TopWindow ist *)
  335.   PROCEDURE scrollup (u: window );
  336.  
  337.   (* Schiebt den Inhalt eines Textfensters eine Zeile nach oben, die
  338.      oberste Zeile verschwindet, die unterste wird gelöscht. "row"
  339.      wird auf "maxrow", "col" auf 0 gesetzt *)
  340.   (* Benutzt copyrect => überprüfen ob Fenster ontop ist *)
  341.  
  342.   PROCEDURE scrolldown (u: window );
  343.  
  344.   (* Schiebt den Inhalt eines Textfenster eine Zeile nach unten, die
  345.      unterste Zeile verschwindet, die oberste wird gelöscht. "row"
  346.      und "col" werden auf 0 gesetzt *)
  347.   (* Benutzt copyrect => überprüfen ob Fenster ontop ist *)
  348.  
  349.  
  350.   PROCEDURE DrawCursor (u: window ; row, col: INTEGER);
  351.  
  352.   (* Zeichnet ein Rechteck in der Grösse eines Zeichenfeldes an die
  353.      angegebene Stelle innerhalb des Fensters. Da alle Pixel inver-
  354.      tiert werden, nimmt ein zweiter Aufruf mit denselben Parametern
  355.      den Cursor wieder weg. *)
  356. (* noch nicht implementiert *)
  357.  
  358.  
  359.   PROCEDURE WriteStr (u: window ; row, col: INTEGER; s: ARRAY OF CHAR);
  360.  
  361.   (* Gibt einen String ab der durch "row" (Zeile) und "col" (Spalte)
  362.      angegebenen Stelle aus. Zeile und Spalte beziehen sich auf den
  363.      Arbeitsbereich des Fensters. Das Zeichen in der linken oberen
  364.      Ecke hat die Koordinaten (0,0).  *)
  365. (* noch nicht implementiert *)
  366.  
  367.  
  368.   PROCEDURE WriteTextBlock (u: window ; row, col: INTEGER;
  369.                             adr: ADDRESS; count: INTEGER);
  370.  
  371.   (* Wie "WriteStr", nur wird der auszugebende String durch die Adresse
  372.      des ersten Zeichens und die Länge angegeben
  373.   *)
  374. (* noch nicht implementiert *)
  375.  
  376.   PROCEDURE WriteTextBuffer (u: window ; adr: ADDRESS;
  377.                              count, offset: INTEGER);
  378.  
  379.   (* Gibt den ab der Adresse "adr" liegenden Text ins Fenster "u" ab
  380.      der Position (0,0) aus, bis entweder 0C im Text auftritt, "count"
  381.      erreicht wird oder das Fenster voll ist. Als Zeilenende wird lf
  382.      erkannt, cr wird ignoriert. Falls "offset" > 0, werden die ersten
  383.      "offset" Zeichen in jeder Zeile übersprungen, so dass sich hori-
  384.      zontale Fensterverschiebungen realisieren lassen. Diese Prozedur
  385.      eignet sich gut für das Redrawing von Textfensterpuffern.
  386.   *)
  387. (* noch nicht implementiert *)
  388.  
  389.  
  390.   PROCEDURE RectToPxy (VAR rect: rectangle; VAR pxy: PxyArrayType);
  391.  
  392.   (* Wandelt die Koordinaten eines Rechtecks von der "rectangle"-Form
  393.      "PxyArray"-Form um (siehe obige Definition)
  394.   *)
  395.  
  396.  
  397.   PROCEDURE DoRedraw (u: window ; x, y, w, h: INTEGER; clip: BOOLEAN);
  398.  
  399.   (* Holt sich von AES die Rechteckliste des Fensters w, schneidet die
  400.      erhaltenen Rechtecke mit dem Desktop und der als Parameter über-
  401.      gebenen Fläche und führt dann die erforderliche Anzahl von Auf-
  402.      rufen der Redraw-Prozedur, die beim Create-Aufruf angegeben wurde,
  403.      aus. "DoRedraw" ist somit die Aktion auf eine Redraw-Message. Mit
  404.      "clip" kann angegeben werden, ob "DoRedraw" selbst den Clipping-
  405.      Aufruf für VDI-Funktionen durchführen soll. In jedem Fall wird
  406.      während des Ablaufs von "DoRedraw" das Window-Update-Flag gesetzt
  407.      und die Maus ausgeschaltet.
  408.   *)
  409.  
  410. (*neu*)
  411. (*  ersatzlos getrichen :                                                 *)
  412. (*  PROCEDURE wd (handle: INTEGER): window;                               *)
  413. (*  wird nicht mehr benötigt da nun genügend Fenster zur Verfügung stehen *)
  414.  
  415.   PROCEDURE wp (u:  window): windowptr;
  416.  
  417.  
  418. END  EasyWindow.
  419.